package negocio.beans;

import gui.cliente.ChatCliente;

import java.util.Collection;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;

import negocio.cliente.negocio.GerenteMensagemExecutor;
import testes.JanelaGUI;

public class Conversa {
	private String idConversa;
	private Usuario usuarioLocal;
	private ConcurrentHashMap<Usuario, GerenteMensagemExecutor> pessoas;
	private BlockingQueue<Mensagem> filaInput;
	
	public Conversa(String idConversa, Usuario usuarioLocal) {
		this.idConversa = idConversa;
		this.usuarioLocal = usuarioLocal;
		pessoas = new ConcurrentHashMap<Usuario, GerenteMensagemExecutor>();
		filaInput = new LinkedBlockingQueue<Mensagem>();
		new ChatCliente(this);
	}
	
	public Conversa(Usuario usuarioLocal) {
		this.idConversa = (usuarioLocal.getLogin() + System.currentTimeMillis());
		this.usuarioLocal = usuarioLocal;
		pessoas = new ConcurrentHashMap<Usuario, GerenteMensagemExecutor>();
		filaInput = new LinkedBlockingQueue<Mensagem>();
	}

	public String getIdConversa() {
		return idConversa;
	}
	public void setIdConversa(String idConversa) {
		this.idConversa = idConversa;
	}
	public ConcurrentHashMap<Usuario, GerenteMensagemExecutor> getPessoas() {
		return pessoas;
	}
	
	public void adicionarPessoa(Usuario usuario, GerenteMensagemExecutor gerente) {
		pessoas.put(usuario, gerente);
	}
	
	public void removerPessoa(Usuario usuario){
		pessoas.remove(usuario);
	}
	
	public void enviarMensagem(Mensagem mensagem){
		mensagem.setRemetente(usuarioLocal);
		mensagem.setIdConversa(idConversa);
		Collection<GerenteMensagemExecutor> gerentes = pessoas.values();
		for(GerenteMensagemExecutor gerente : gerentes){
			System.out.println("Enviando mensagem! ");
			gerente.enviarMensagem(mensagem);
		}
	}

	public Mensagem receberMensagem() throws InterruptedException {
	
			return filaInput.take();
		
	}
	
	public void inserirMensagem(Mensagem mensagem){
		try {
			filaInput.put(mensagem);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
}
